package com.ruoyi.wechatapi.controller;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.framework.config.ServerConfig;
import com.ruoyi.labdata.domain.LabFile;
import com.ruoyi.labdata.service.ILabFileService;

/**
 * 通用请求处理
 * 
 * @author ruoyi
 */
@RestController
public class FileController {
	private static final Logger log = LoggerFactory.getLogger(FileController.class);

	@Autowired
	private ServerConfig serverConfig;
	
	@Autowired
    private ILabFileService labFileService;

	/**
	 * 通用下载请求
	 * 
	 * @param fileName
	 *            文件名称
	 * @param delete
	 *            是否删除
	 */
	@GetMapping("api/download")
	public void fileDownload(String fileName, Boolean delete, HttpServletResponse response,
			HttpServletRequest request) {
		try {
			if (!FileUtils.isValidFilename(fileName)) {
				throw new Exception(StringUtils.format("文件名称({})非法，不允许下载。 ", fileName));
			}
			String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
			String filePath = RuoYiConfig.getDownloadPath() + fileName;

			response.setCharacterEncoding("utf-8");
			response.setContentType("multipart/form-data");
			response.setHeader("Content-Disposition",
					"attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName));
			FileUtils.writeBytes(filePath, response.getOutputStream());
			if (delete) {
				FileUtils.deleteFile(filePath);
			}
		} catch (Exception e) {
			log.error("下载文件失败", e);
		}
	}
	@GetMapping(value = "api/image/{fileId}")
    public String downloadImage(@PathVariable String fileId, HttpServletRequest request, HttpServletResponse response) {
        //String fileName = "123.JPG";
		String id = fileId.substring(0, fileId.indexOf("."));
    	LabFile labFile = labFileService.selectLabFileById(Long.valueOf(id));
    	if(labFile==null){
    		throw new RuntimeException("未能查找到该图片ID:" + fileId);
    	}
    	String fileUrl = RuoYiConfig.getProfile() + StringUtils.substringAfter(labFile.getFilePath(), Constants.RESOURCE_PREFIX);
        File file = new File(fileUrl);
            if (file.exists()) {
                //response.setContentType("application/force-download");// 设置强制下载不打开
                //response.setHeader("Content-Type","video/mpeg4");
            	 response.setContentType("image/jpeg");  
                //response.addHeader("Content-Disposition",
                //        "attachment;fileName=" + labFile.getFileName());// 设置文件名
                byte[] buffer = new byte[1024];
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                try {
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    OutputStream os = response.getOutputStream();
                    int i = bis.read(buffer);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                    }
                    //System.out.println("success");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (bis != null) {
                        try {
                            bis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fis != null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        return null;
    }

	/**
	 * 通用上传请求
	 */
	@PostMapping("/api/upload")
	public AjaxResult uploadFile(@RequestParam("file") MultipartFile[] files)
			throws Exception {
		try {
			
			// 上传文件路径
			String filePath = RuoYiConfig.getUploadPath();
			// 上传并返回新文件名称
			List<String> fileNameList = new ArrayList<String>();
			for (int i = 0; i < files.length; i++) {
				String savePath = FileUploadUtils.upload(filePath, files[i]);
				fileNameList.add(savePath);
				//System.out.println("checkId="+checkId);
			}
			String url = serverConfig.getUrl();
			AjaxResult ajax = AjaxResult.success();
			ajax.put("fileName", fileNameList);
			ajax.put("url", url);
			return ajax;
		} catch (Exception e) {
			e.printStackTrace();
			return AjaxResult.error(e.getMessage());
		}
	}

	/**
	 * 本地资源通用下载
	 */
	@GetMapping("/api/download/resource")
	public void resourceDownload(String name, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		// 本地资源路径
		String localPath = RuoYiConfig.getProfile();
		// 数据库资源地址
		String downloadPath = localPath + StringUtils.substringAfter(name, Constants.RESOURCE_PREFIX);
		// 下载名称
		String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
		response.setCharacterEncoding("utf-8");
		response.setContentType("multipart/form-data");
		response.setHeader("Content-Disposition",
				"attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName));
		FileUtils.writeBytes(downloadPath, response.getOutputStream());
	}

}
